╫HILE THIS PROGRAM WILL NOT FIND YOUR GLASSES OR A FAVORITE BOOK, IT WILL FIND A SPECIFIC SEQUENCE OF LETTERS IN A PRESORTED LIST, AS IN THIS EXAMPLE:
// PIC: SEARCH //
╙UCH A LIST CAN CONTAIN ANYTHING: LIBRARY CATALOGS, PHONE DIRECTORIES, REVERSE PHONE DIRECTORIES, LISTS OF STUDENT NAMES, LISTS OF PROGRAMS ON YOUR TAPE OR A FLOPPY DISK, AND SO ON.
"╨RESORTED" IS A BUZZWORD MEANING THAT THE ITEMS ARE IN AN ALPHABETICAL OR NUMERIC SEQUENCE. ╘HE LIST NEEDS TO BE IN "ASCENDING ORDER". ╩UST ANOTHER BUZZWORD. ╘HIS ONE MEANS "IN INCREASING ORDER". ╘HAT IS FROM ┴ TO ┌. ╔F YOU KEEP YOUR PHONE LIST IN A ┌ TO ┴ ORDER, YOU WILL HAVE TO RETHINK THE PROGRAM.
╙UPPOSE WE HAVE A LIST OF FRIENDS, SUPPLIERS OR CUSTOMERS AND THEIR PHONE NUMBERS. ╞OR AN EXAMPLE, SEE THE ─┴╘┴ LINES. ╬OW WE WISH TO FIND THE ╨╠╒═┬┼╥. ╥UN THIS PROGRAM, AND AS AN ANSWER TO THE ╔╬╨╒╘ QUERY OVERTYPE ╨╠╒═┬┼╥. ╘HE PROGRAM DISPLAYS THE INFORMATION RIGHT UNDER YOUR REQUEST FOR ╨╠╒═┬┼╥. ╘O QUIT, PUSH ╥┼╘╒╥╬ OVER THE ASTERISK AFTER THE QUESTION MARK.
// PRG: SEARCH //
Ç*FP10
*** ╓┴╥╔┴┬╠┼╙ ***
╥ NUMBER OF RECORDS
╞ NUMBER OF FIELDS PER RECORD
╞╠ FIELD NUMBER WE'RE SEARCHING
╨═ PATTERN-MATCHING FLAG
╬├ NUMBER OF CHARACTERS TO MATCH
╞╠ IS THE FIELD NUMBER WE'RE SEARCHING, HERE IT IS NUMBER 1.
╧╦ FLAG: ZERO IF WE FOUND NOTHING
MINUS ONE OTHERWISE
*** ╔╬╙╘╥╒├╘╔╧╬╙ ***
╘HE GRAPHIC CHARACTERS IN THE ╔╬╨╒╘ PROMPT ARE THE SAME AS IN THE SORT PROGRAM.
┴S THERE ARE ONLY TWO FIELDS IN EACH RECORD, YOU INPUT OPTIONS ARE TO OVERTYPE THE STAR WITH NUMBER 1 OR 2. ╘O STOP THE PROGRAM PRESS ╥┼╘╒╥╬ OVER THE ASTERISK.
*** ─┼╘┴╔╠╙ ***
╘HE PROGRAM REQUIRES THAT THE LIST TO BE SEARCHED BE IN SORTED ORDER IN THE FIELD YOU PLAN TO EXAMINE. ╬UMBER OF RECORDS (╥) AND FIELDS (╞) IS FIXED IN LINE 140. ╘HIS IS NOT UNREASONABLE, SINCE NORMALLY ONCE YOU BEGIN THE SEARCH, THE SORT ROUTINE HAS TOLD YOU HOW MANY RECORDS THERE ARE. ╔F NOT, IF YOU'RE READING DATA FROM TAPE OR DISK, SLIGHT MODIFICATIONS TO THIS ROUTINE WILL BE NEEDED.
╨═ IS SET TO 1 WHEN THE ╔╬╨╒╘ SAW SEVERAL CHARACTERS FOLLOWED BY ASTERISK. ╔T STANDS FOR "PATTERN MATCHING". ╨═ IS ZERO IF WE DO NOT USE THE STAR.
╬├ IS NUMBER OF CHARACTERS WE MUST MATCH. ╔T IS THE SAME AS INPUT WHEN NO STAR WAS USED. ╔T IS ONE CHARACTER SHORTER IF A STAR WAS USED. ╙EE LINE 180 WHERE THIS IS TAKEN CARE OF. ╔F YOU INPUT NOTHING, I.E. IF YOU PRESS ╥┼╘╒╥╬ OVER THE STAR, WE END THE PROGRAM. ╘HAT, TOO, IS TAKEN CARE OF IN LINE 180.
╧╦ IS A FLAG. ╔F FALSE (ZERO), WE FOUND NOTHING. ╔F TRUE (NON-ZERO, HERE -1), WE FOUND A MATCHING ENTRY!
╠INE 190 PREPARES THE FINAL SEARCH STRING AND CALLS THE SEARCH SUBROUTINE. (╔T IS A SEPARABLE HUNK OF CODE, SINCE IT CAN BE USED FOR MANY APPLICATIONS. ╙O EVEN THOUGH IT INVOLVES SOME SETUP, THE TIME WASTED ON THE SETUP IS MINIMAL COMPARED TO YOUR TIME IN REWRITING IT FOR EVERY USE). ╧N RETURN, IF NOTHING WAS FOUND, WE SAY SO IN LINE 200. ╧THERWISE WE DISPLAY THE RECORD.
╘HE SEARCH SUBROUTINE IN LINES 7000-7050 IS A FAIRLY QUICK WAY TO SEARCH. ╔T IS RELATED TO A SO CALLED BINARY-CHOP METHOD, WHERE A SORTED LIST IS SPLIT IN HALF (LINE 7010) IN SUCCESSIVE STEPS SO AS TO MINIMIZE THE NUMBER OF COMPARISONS. ╫HEN WE GET CLOSE TO BEING RIGHT WE ADJUST THE INTERVAL SIZE IN TINY STEPS UNTIL A MATCH IS FOUND. ╫E THEN MAKE VARIABLE ╧╦ "TRUE", THAT IS -1. ╧THERWISE, IF OUR UPPER AND LOWER LIMITS (╒╠ AND ╠╠) HAVE MET, WE'VE RUN OUT OF DATA, ╧╦ REMAINS "FALSE" (0) AND WE RETURN.
╘HE PROCEDURE IS ANALOGOUS TO THE WAY MOST PEOPLE LOOK FOR INFORMATION IN AN ENCYCLOPEDIA OR A PHONE BOOK. ╔F WE'RE LOOKING FOR "╦┼╬╬┼╠" WE'RE UNLIKELY TO BEGIN THE SEARCH WITH THE ┴ ENTRIES. ╫E SPLIT THE BOOK, MORE OR LESS, IN HALF. ╔F THE LETTER IS ═, WE SPLIT THE LOWER PART IN HALF AGAIN, PERHAPS ENDING UP WITH THE ╟ ENTRIES. ╬O NEED TO GO BEYOND EITHER ═ OR ╟. ╫E CAN FIND ╦ FAIRLY EASILY, ONCE THE RANGE HAS BEEN NARROWED DOWN. ╘HIS ROUTINE DOES AN IDENTICAL THING WITH ONE, PROFOUND, EXCEPTION: THE COMPUTER DIVIDES THE INTERVALS EXACTLY IN HALF, NONE OF THAT SLOPPY HUMAN WORK!
*** ╨╥╧╩┼├╘╙ ***
╘RY SOME VARIATIONS OF THE INPUT: FIRST SEE WHAT HAPPENS IF YOU ASK FOR ┴╔╥ ├╧╬─╔╘╔╧╬╔╬╟. ╙ECONDLY, ENTER JUST A FEW SIGNIFICANT LETTERS, SUCH AS ╨╠* (THE ASTERISK AT THE END MEANS "DON'T CARE WHAT FOLLOWS"). ╚OW MANY SIGNIFICANT LETTERS WILL YOU HAVE TO PUT IN TO GET ├┴╥╨╧╧╠ RATHER THAN ├┴╥╨┼╬╘┼╥?
┴SK THE COMPUTER TO TELL US ALL ENTRIES THAT BEGIN WITH A ├ BUT AREN'T A ├┴╥╨╧╧╠? ├AN YOU THINK OF REASONS FOR DOING THAT?
╥EWRITE THIS CODE TO MAKE IT GENERAL FOR SEARCHING ANY OTHER FIELD, NOT ONLY NUMBER ONE. ┴GAIN, THINK WHY THIS APPROACH WOULD BE BETTER.
╘HINK OF A BETTER WAY TO GET THE COUNT OF RECORDS TO THE COMPUTER INSTEAD OF THE CURRENT SETTING OF VARIABLE ╥ TO A SPECIFIC NUMBER.